from process import baseFunction as bf
from typing import List, Dict, Any, Optional
import pandas as pd


def getLine_daily_floatMv_amount(
    tsCode: str,
    period: str,
    table_name: str,
    columns: List[str],    
    conditions: Optional[Dict[str, str]] = None,
    order_by: Optional[str] = None,
    limit: Optional[int] = None,
    join_clause: Optional[str] = None,
    group_by: Optional[List[str]] = None,
    having_clause: Optional[str] = None
) -> Dict[str, Any]:
    """
    获取指定 ts_code 和 period 的市场金额数据，并支持灵活的 SQL 查询构建。

    参数:
    - tsCode: str - 股票代码
    - period: str - 数据周期（'W' 表示周，'M' 表示月）
    - columns: List[str] - 需要包含在结果中的列名
    - date_format: str - 日期格式，默认为 '%Y-%m-%d'
    - conditions: Optional[Dict[str, str]] - 查询的条件字典
    - order_by: Optional[str] - 排序字段
    - limit: Optional[int] - 查询结果限制
    - join_clause: Optional[str] - SQL JOIN 子句
    - group_by: Optional[List[str]] - GROUP BY 子句
    - having_clause: Optional[str] - HAVING 子句

    返回:
    - Dict[str, Any]: JSON 格式的返回数据，包含指定的列和格式化的日期
    """

    # table_name = "market_amount"  # 假设你的表名是这样，可以根据实际情况调整
    field_names = ["trade_date"] + columns  # 默认包含 trade_date 和用户指定的列
    conditions = {"ts_code": tsCode}
    # 生成 SQL 查询语句
    query = bf.generate_query(
        table_name=table_name,
        field_names=field_names,
        conditions=conditions,
        order_by=order_by,
        limit=limit,
        join_clause=join_clause,
        group_by=group_by,
        having_clause=having_clause
    )

    # 确保 conditions 为非空且包含有效参数
    condition_values = tuple(conditions.values()) if conditions else ()
    # 执行查询，获取结果
    result = bf.execute_query(query, condition_values)  # 假设 tsCode 是查询条件之一

    # 将查询结果转换为 DataFrame 以便后续处理
    df = pd.DataFrame(result, columns=field_names)
    
    # 根据 period 进行数据重采样（如果需要）
    if period in ['W', 'M']:
        df = bf.resample_data(df, period, field_names)
    
    # 格式化结果数据
    result_data = bf.format_result_data(df, columns=field_names)    
    return result_data